home *** CD-ROM | disk | FTP | other *** search
/ Introduction to 3D Game …ogramming with DirectX 12 / Introduction-to-3D-Game-Programming-with-DirectX-12.ISO / Code.Textures / Chapter 23 Character Animation / SkinnedMesh / SkinnedData.h < prev    next >
C/C++ Source or Header  |  2016-03-02  |  2KB  |  82 lines

  1. #ifndef SKINNEDDATA_H
  2. #define SKINNEDDATA_H
  3.  
  4. #include "../../Common/d3dUtil.h"
  5. #include "../../Common/MathHelper.h"
  6.  
  7. ///<summary>
  8. /// A Keyframe defines the bone transformation at an instant in time.
  9. ///</summary>
  10. struct Keyframe
  11. {
  12.     Keyframe();
  13.     ~Keyframe();
  14.  
  15.     float TimePos;
  16.     DirectX::XMFLOAT3 Translation;
  17.     DirectX::XMFLOAT3 Scale;
  18.     DirectX::XMFLOAT4 RotationQuat;
  19. };
  20.  
  21. ///<summary>
  22. /// A BoneAnimation is defined by a list of keyframes.  For time
  23. /// values inbetween two keyframes, we interpolate between the
  24. /// two nearest keyframes that bound the time.  
  25. ///
  26. /// We assume an animation always has two keyframes.
  27. ///</summary>
  28. struct BoneAnimation
  29. {
  30.     float GetStartTime()const;
  31.     float GetEndTime()const;
  32.  
  33.     void Interpolate(float t, DirectX::XMFLOAT4X4& M)const;
  34.  
  35.     std::vector<Keyframe> Keyframes;     
  36. };
  37.  
  38. ///<summary>
  39. /// Examples of AnimationClips are "Walk", "Run", "Attack", "Defend".
  40. /// An AnimationClip requires a BoneAnimation for every bone to form
  41. /// the animation clip.    
  42. ///</summary>
  43. struct AnimationClip
  44. {
  45.     float GetClipStartTime()const;
  46.     float GetClipEndTime()const;
  47.  
  48.     void Interpolate(float t, std::vector<DirectX::XMFLOAT4X4>& boneTransforms)const;
  49.  
  50.     std::vector<BoneAnimation> BoneAnimations;     
  51. };
  52.  
  53. class SkinnedData
  54. {
  55. public:
  56.  
  57.     UINT BoneCount()const;
  58.  
  59.     float GetClipStartTime(const std::string& clipName)const;
  60.     float GetClipEndTime(const std::string& clipName)const;
  61.  
  62.     void Set(
  63.         std::vector<int>& boneHierarchy, 
  64.         std::vector<DirectX::XMFLOAT4X4>& boneOffsets,
  65.         std::unordered_map<std::string, AnimationClip>& animations);
  66.  
  67.      // In a real project, you'd want to cache the result if there was a chance
  68.      // that you were calling this several times with the same clipName at 
  69.      // the same timePos.
  70.     void GetFinalTransforms(const std::string& clipName, float timePos, 
  71.          std::vector<DirectX::XMFLOAT4X4>& finalTransforms)const;
  72.  
  73. private:
  74.     // Gives parentIndex of ith bone.
  75.     std::vector<int> mBoneHierarchy;
  76.  
  77.     std::vector<DirectX::XMFLOAT4X4> mBoneOffsets;
  78.    
  79.     std::unordered_map<std::string, AnimationClip> mAnimations;
  80. };
  81.  
  82. #endif // SKINNEDDATA_H